/* 
 * StikiWeb Wiki - a Wiki for Hierarchical Organizations
 * $Id: DeletePageAction.java,v 1.1 2004/05/05 05:23:43 biglee Exp $
 * 
 * ***** BEGIN LICENSE BLOCK *****
 * Version: MPL 1.1
 *
 * The contents of this file are subject to the Mozilla Public License Version
 * 1.1 (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 * http://www.mozilla.org/MPL/
 *
 * Software distributed under the License is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
 * for the specific language governing rights and limitations under the
 * License.
 *
 * The Original Code is the StikiWeb Wiki.
 *
 * The Initial Developer of the Original Code is Lee Haslup (biglee@haslups.com).
 * Portions created by the Initial Developer are Copyright (C) 2004
 * the Initial Developer. All Rights Reserved.
 *
 * Contributor(s):
 *
 * ***** END LICENSE BLOCK ***** 
 */
package org.stikiweb.struts;

import java.util.Iterator;
import java.util.Vector;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.stikiweb.contentMagnager.AttachmentManager;
import org.stikiweb.contentMagnager.PageManager;
import org.stikiweb.contentMagnager.PermissionManager;

/**
 * @author biglee
 *
 * To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Generation - Code and Comments
 */
public class DeletePageAction extends StikiAction {

	/* (non-Javadoc)
	 * @see org.apache.struts.action.Action#execute(org.apache.struts.action.ActionMapping, org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
	 */
	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest req, HttpServletResponse resp) throws Exception {
		
		//get the form the user submitted.
		ConfirmDeleteBean cdb = (ConfirmDeleteBean) form;
		
		// if the user cancelled, we're done.
		HttpSession session = req.getSession();
		if(req.getParameter("cancel") != null) {
			return new ActionForward("/viewPage.do?name=" + session.getAttribute("currentPage"));
		}
		
		// If there is no name we cannot proceed
		if(cdb.name == null) {
			return mapping.findForward("failure");
		}
		
		// Are we deleting an attachment?
		boolean isAttachment = 
		   (cdb.targetIsAttachment!=null
			&&(   cdb.targetIsAttachment.toUpperCase().startsWith("Y")
			   || cdb.targetIsAttachment.toUpperCase().startsWith("T")));
		
		// If user lacks permission we cannot proceed
		PermissionManager permMgr = PermissionManager.solo();
		String theUser = getUserName(req);
		if(!permMgr.canDelete(theUser,cdb.name)) {
			return mapping.findForward("failure");
		}

		// Can't delete an object that isn't there...
		PageManager pageMgr = PageManager.solo();
		AttachmentManager attMgr = AttachmentManager.solo();
		if(		(isAttachment && !attMgr.attachmentExists(cdb.name))
			||	(!isAttachment && !pageMgr.pageExists(cdb.name))            ) {
			return mapping.findForward("failure");
		}
		
		// can't delete a page that has children or attachments.
		boolean blocked = false;
		if(!isAttachment) {
			Vector children = pageMgr.listChildren(cdb.name,true);
			if(children.size()>0) {
				cdb.isBlocked = "YES";
				blocked = true;
				Iterator it = children.iterator();
				cdb.blockerList = "";
				String sep = "";
				while(it.hasNext()) {
					String child = (String)it.next();
					cdb.blockerList += sep + child;
					sep = ", ";
				}
			}
		}
		
		// At this point we have verified that the user is permitted to delete an object
		// that can be deleted.  If user has confirmed, perform the delete.
		if(!blocked && req.getParameter("confirm")!=null) {
			
			// decide where the user should go after we delete the page
			String landingZone = "Main";
			if(permMgr.userPermLevelForParentPage(theUser,cdb.name)>=PermissionManager.READ) {
				landingZone = permMgr.parentOf(cdb.name);
				if(landingZone.length()==0) {
					landingZone = "Main";
				}
			}
			session.setAttribute("currentPage",landingZone);
			
			if(isAttachment) {
				AttachmentManager.solo().deleteAttachment(cdb.name);
			}
			else {
				PageManager.solo().deletePage(cdb.name);
			}
			return new ActionForward("/viewPage.do?name=" + landingZone);
		}
		
		cdb.targetIsAttachment = isAttachment? "YES" : "NO" ;
		
		return new ActionForward(mapping.getInput());
	}
}
